/*
    项目中各种消息字段的宏定义
    1. 请求字段
    2. 消息类型
    3. 相应码
    4. RPC请求类型
    5. 主题操作类型
    6. 服务操作类型
*/

#pragma once

#include <iostream>
#include <string>
#include <unordered_map>

namespace myrpc
{
    //请求字段
    #define KEY_METHOD "method" // 方法名称
    #define KEY_PARAMS "parameters" // 方法参数
    #define KEY_TOPIC_KEY "topic_key" // 主题名称
    #define KEY_TOPIC_MSG "topic_msg" // 主题消息内容
    #define KEY_OPTYPE "optype" // 操作类型
    #define KEY_HOST "host" // 主机信息
    #define KEY_HOST_IP "ip" // ip信息
    #define KEY_HOST_PORT "port" // 端口信息
    #define KEY_RCODE "rcode" // 相应码
    #define KEY_RESULT "result" // 返回结果

    //消息类型
    enum class MType 
    {
        REQ_RPC = 0,
        RSP_RPC,
        REQ_TOPIC,
        RSP_TOPIC,
        REQ_SERVICE,
        RSP_SERVICE
    };

    //RPC请求类型
    enum class RType 
    {
        //REQ_SYNC = 0, // 同步
        
        REQ_ASYNC = 0, // 异步
        REQ_CALLBACK // 回调
    };

    //主题操作类型
    enum class TopicOptype 
    {
        TOPIC_CREATE = 0, // 创建
        TOPIC_REMOVE, // 删除
        TOPIC_SUBSCRIBE, // 订阅
        TOPIC_CANCEL, // 取消订阅
        TOPIC_PUBLISH // 发布
    };

    //服务操作类型
    enum class ServiceOptype
    {
        SERVICE_REGISTRY = 0, // 注册
        SERVICE_DISCOVERY, // 发现
        SERVICE_ONLINE, // 上线
        SERVICE_OFFLINE // 下线
    };

    //响应码
    enum class RCode
    {
        RCODE_OK = 0,
        RCODE_PARSE_FAILED,
        RCODE_ERROR_MSGTYPE,
        RCODE_INVALID_MSG,
        RCODE_DISCONNECTED,
        RCODE_INVALID_PARAMS,
        RCODE_NOT_FOUND_SERVICE,
        RCODE_INVALID_OPTYPE,
        RCODE_NOT_FOUND_TOPIC,
        RCODE_INTERNAL_ERROR
    };

    //获取相应码对应的提示说明
    static std::string errReason(RCode code) 
    {
        static std::unordered_map<RCode, std::string> err_map = 
        {
            {RCode::RCODE_OK, "成功处理！"},
            {RCode::RCODE_PARSE_FAILED, "消息解析失败！"},
            {RCode::RCODE_ERROR_MSGTYPE, "消息类型错误！"},
            {RCode::RCODE_INVALID_MSG, "无效消息"},
            {RCode::RCODE_DISCONNECTED, "连接已断开！"},
            {RCode::RCODE_INVALID_PARAMS, "无效的Rpc参数！"},
            {RCode::RCODE_NOT_FOUND_SERVICE, "没有找到对应的服务！"},
            {RCode::RCODE_INVALID_OPTYPE, "无效的操作类型"},
            {RCode::RCODE_NOT_FOUND_TOPIC, "没有找到对应的主题！"},
            {RCode::RCODE_INTERNAL_ERROR, "内部错误！"}
        };
        auto it = err_map.find(code);
        if (it == err_map.end()) 
            return "未知错误！";
        return it->second;
    }
}